﻿//////////////////////////////////////////////////////////////////////////////
//
//  Copyright © 1998-2024 Glodon Company Limited.  All rights reserved.
//
//  Use of this software is subject to the terms of the Glodon license
//  agreement provided at the time of installation or download, or which
//  otherwise accompanies this software in either electronic or hard copy form.  
//
//////////////////////////////////////////////////////////////////////////////

#pragma once

#include "GcmpPickInterface.h"
#include "IObject.h"

namespace gcmp {
    class IDocument;
    class IGraphicsNodeReference;
    class IHighlightChangeEvent;

    /// \brief 高亮集，为单例对象，全局唯一
    ///
    /// 当前被高亮的对象均存于此高亮集中
    /// 和选择集非常相似。都是一组GraphicsNodeReference且都以同样的方式高亮。都可以是一次或多次选择的结果。
    /// 它和选择集的区别在于：
    /// 它仅仅用于高亮。他不会触发选择集可触发的其它的行为。
    /// 整个app只有唯一个高亮集，由渲染框架负责高亮此集合
    class GCMP_PICK_INTERFACE_EXPORT IHighlights : public IObject
    {
        DEFINE_CAST_DERIVED(IHighlights, IObject);
    public:

        /// \brief 获得高亮集
        /// \return 高亮集指针
         static IHighlights* Get();

        /// \brief 初始化高亮集
        ///
        /// 调用时机：切换文档时
        /// 所做操作：重置文档+清空高亮集内容
        /// \param pDocument 当前文档信息
        /// \return void
        virtual void Init(const IDocument* pDocument) = 0;
 
        /// \brief 清除高亮集中内容
        /// \return void
        virtual void Clear() = 0;

        /// \brief 判断高亮集是否为空
        /// \return 返回true表示为空，false表示不为空
        virtual bool IsEmpty() const = 0;

        /// \brief 获得高亮集中图形节点数量
        /// \return 高亮集中图形节点数量
        virtual Int64 GetCount() const = 0;

        /// \brief 获得高亮集中所有图形节点
        /// \return 返回高亮集中所有图形节点引用集合
        virtual const std::vector<OwnerPtr<IGraphicsNodeReference>>& GetGraphicsNodeReferences() const = 0;

        /// \brief 向高亮集中添加图形节点引用
        /// \param graphicsNodeReferences 被添加的图形节点引用
        /// \return void
        virtual void AddGraphicsNodeReference(const IGraphicsNodeReference& graphicsNodeReference) = 0;

        /// \brief 向高亮集中添加图形节点引用集合
        /// \param graphicsNodeReferences 被添加的图形节点引用集合
        /// \return void
        virtual void AddGraphicsNodeReferences(const std::vector<OwnerPtr<IGraphicsNodeReference>>& graphicsNodeReferences) = 0;

        /// \brief 设置高亮集中的图形节点引用集合
        ///
        /// 设置新数据之前会清除旧数据
        /// \param graphicsNodeReferences 新设置的图形节点引用集合
        /// \return void
        virtual void SetGraphicsNodeReferences(const std::vector<OwnerPtr<IGraphicsNodeReference>>& graphicsNodeReferences) = 0;

        /// \brief 获得高亮集发生改变通知事件
        /// \return 高亮集发生改变发送通知事件
        virtual IHighlightChangeEvent* GetHighlightChangeEvent() const = 0;
    };

}// namespace gcmp

